import Cookies from 'js-cookie';
import axios from 'axios';
import { Notice } from 'iview';
import { router } from '../router/index';

// 请求基础路径
const baseURL = '/';
axios.interceptors.request.use(config => {
    // 开始请求
    config.baseURL = baseURL;
    config.timeout = 30000;
    config.validateStatus = (status) => { return status >= 200 && status < 300; };
    return config;
}, error => {
    Notice.error({ title: '请求发送失败', duration: 4.5 });
    return Promise.reject(error);
});

// 服务端状态码
const codeMessage = {
    200: '服务器成功返回请求的数据',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据,的操作。',
    401: '用户没有权限（令牌、用户名、密码错误）。',
    403: '用户得到授权，但是访问是被禁止的。',
    404: '发出的请求针对的是不存在的记录，服务器没有进行操作',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器',
    502: '网关错误',
    503: '服务不可用，服务器暂时过载或维护',
    504: '网关超时'
};

// 请求异常通知
const errorNotice = (error) => {
    let result = false;
    if (error && error.response) {
        const response = error.response;
        if (response && response.data && response.data.timestamp) {
            result = true;
            // 401 未登录
            if (response.status === 401) {
                Cookies.remove('user');
                router.push({ name: 'login' });
                return result;
            }
            // 403 无权访问
            if (response.status === 403) {
                router.push({ name: 'error-403' });
                return result;
            }
            // 404 资源不存在
            if (response.status === 404) {
                router.push({ name: 'error-404' });
                return result;
            }
            // // 500 服务器异常
            // if (response.status === 500) {
            //     router.push({ name: 'error-500' });
            //     return result;
            // }
            const data = response.data;
            if (data.validMessageList) {
                data.message = '请求参数校验失败';
            }
            Notice.error({ title: `${data.error} -> ${data.path}`, desc: data.message, duration: 4.5 });
            return result;
        }
        const errortext = codeMessage[response.status] || response.statusText;
        Notice.error({ title: `请求错误,响应状态码:${response.status}`, desc: errortext, duration: 4.5 });
    } else {
        Notice.error({ title: '请求服务端异常', duration: 4.5 });
    }
    return result;
};

axios.interceptors.response.use(response => {
    return response;
}, error => {
    // resolve 通过， reject 驳回
    if (errorNotice(error)) {
        return Promise.reject(error.response);
    } else {
        return Promise.reject(error);
    }
});

// 处理响应数据
const transformResponse = (response) => {
    if (response.data) {
        return response.data;
    }
    return null;
};

export default {
    request(config) {
        return axios.request(config).then(response => transformResponse(response));
    },
    get(url, config) {
        return axios.get(url, config).then(response => transformResponse(response));
    },
    delete(url, config) {
        return axios.delete(url, config).then(response => transformResponse(response));
    },
    head(url, config) {
        return axios.head(url, config).then(response => transformResponse(response));
    },
    options(url, config) {
        return axios.options(url, config).then(response => transformResponse(response));
    },
    post(url, data, config) {
        return axios.post(url, data, config).then(response => transformResponse(response));
    },
    put(url, data, config) {
        return axios.put(url, data, config).then(response => transformResponse(response));
    },
    patch(url, data, config) {
        return axios.patch(url, data, config).then(response => transformResponse(response));
    }
};
